package br.com.alinesoftware.app.controller.jsf.cliente;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.inject.Inject;

import br.com.alinesoftware.app.controller.jsf.AppEditMB;
import br.com.alinesoftware.app.domain.RedeSocial;
import br.com.alinesoftware.app.entity.Cliente;
import br.com.alinesoftware.app.entity.ClienteProprietario;
import br.com.alinesoftware.app.entity.ContaRedeSocial;
import br.com.alinesoftware.app.entity.ContaRedeSocialEntity;
import br.com.alinesoftware.app.facade.cliente.IClienteFacade;

import com.powerlogic.jcompany.commons.util.cdi.PlcCDIUtil;

public class ClienteEditMB extends AppEditMB {

	private static final long serialVersionUID = 4827595929523552847L;

	@Inject
	IClienteFacade clienteFacade;
	
	@Override
	protected boolean editBefore() {
		Cliente cliente = (Cliente) getEntity();
		log.info(cliente);
		return super.editBefore();
	}

	@Override
	protected String editAfter() {
		
		Cliente cliente = (Cliente) getEntity();
		log.info(cliente);
		atualizaRedeSocial(cliente.getClienteProprietario());
		return super.editAfter();
	}
	
	@Override
	protected Object[] editFindAfter(Object[] ret) {
		Cliente cliente = (Cliente) ret[0];
		if (cliente.getTelefone() != null && cliente.getTelefone().getId() != null) {
			cliente.setTelefone(clienteFacade.retrieTelefoneById(cliente.getTelefone().getId()));			
		}
		if (cliente.getEndereco() != null && cliente.getEndereco().getId() != null) {
			cliente.setEndereco(clienteFacade.retriveEnderecoById(cliente.getEndereco().getId()));
			cliente.getEndereco().setCidade(clienteFacade.retriveCidadeById(cliente.getEndereco().getCidade().getId()));
			cliente.getEndereco().getCidade().setEstado(clienteFacade.retriveEstadoById(cliente.getEndereco().getCidade().getEstado().getId()));
		}
		for (ClienteProprietario clienteProprietario : cliente.getClienteProprietario()) {
			if (clienteProprietario.getProprietario().getId() != null) {
				clienteProprietario.setProprietario(clienteFacade.retriveProprietarioById(clienteProprietario.getProprietario().getId()));				
			}
		}
		return super.editFindAfter(ret);
	}
	
	/**
	 * Metodo prara completar as redes sociais do proprietario caso ele tenha apenas facebook inclui
	 * os demais na lista, no metodo de gravacao devera remover as nao utilizadas
	 * @param clienteProprietario
	 */
	private void atualizaRedeSocial(List<ClienteProprietario> clienteProprietario) {
		List<RedeSocial> redes = new ArrayList<RedeSocial>(Arrays.asList(RedeSocial.values()));
		List<RedeSocial> contaProprietario = new ArrayList<RedeSocial>();
		for (ClienteProprietario proprietario : clienteProprietario) {
			if (proprietario.getProprietario().getContaRedeSocial() == null) {
				proprietario.getProprietario().setContaRedeSocial(new ArrayList<ContaRedeSocial>());
			}
			contaProprietario.clear();
			for (ContaRedeSocial contaRedeSocial : proprietario.getProprietario().getContaRedeSocial()) {
				contaProprietario.add(contaRedeSocial.getRedeSocial());
			}
			for (RedeSocial redeSocial : redes) {
				if (!contaProprietario.contains(redeSocial)) {
					ContaRedeSocial contaRedeSocial = PlcCDIUtil.getInstance().getInstanceByType(ContaRedeSocialEntity.class);
					contaRedeSocial.setRedeSocial(redeSocial);
					proprietario.getProprietario().getContaRedeSocial().add(contaRedeSocial);
				}
			}			
		}
	}
	
}
